/*
 * Insercion.java
 *
 * Creada el 27 de noviembre de 2007, 06:40 PM
 *
 */

package FachadaDatos;

import CapaLogica.*;
import com.sun.crypto.provider.RSACipher;
import java.util.*;
import java.io.*;
import java.net.*;
import javax.servlet.*;
import javax.servlet.http.*;
import java.sql.*;
import FachadaInterfaz.*;
import org.omg.PortableServer.SERVANT_RETENTION_POLICY_ID;

/**
 *
 * @author Solware
 */
public class Insercion {
    
    public static int insertarUsuarioServidor(UsuarioServidor usr) {
        
        Conexion.conectar();
        String code = "02000";
        
        try {
            Statement stmt = Conexion.conexion.createStatement();
            int id = usr.getId();
            String nombre = usr.getNombre();
            String apellido = usr.getApellido();
            String telefono = usr.getTelefono();
            String email = usr.getEmail();
            String profesion = usr.getProfesion();
            int perfil = usr.getPerfil();
            String password = usr.getPassword();
            String nickname = usr.getNickname();
            int seccion = usr.getSeccion();
            
            ResultSet rst =
                    stmt.executeQuery("INSERT INTO usuario_servidor VALUES ('"+id+"', '"+nombre+"', '"+apellido+"', '"+
                    telefono+"', '"+email+"', '"+profesion+"', '"+perfil+"', '"+
                    password+"', '"+nickname+"', '"+seccion+"')");
        } catch (SQLException e) {
            /* Al ejecutar el query, siempre se lanza una excepcion.  *
             * Aqui se establece el codigo de estado de la BD despues *
             * de haber hecho la insercion.                           */
            code = e.getSQLState();
        }        
        return Integer.parseInt(code);
    }
    
    public static int insertarSolicitud(Solicitud sol) throws SQLException, ServletException {
        
        Conexion.conectar();
                        
        Statement stmt = Conexion.conexion.createStatement();
        
        String descripcion = sol.getDescripcion();
        int solicitante = sol.getSolicitante();
        int cola = sol.getCola();
        int pos_cola = sol.getPosCola();
        int prioridad = sol.getPrioridad();
        int estado = sol.getEstado();
        java.util.Date fecha_realizacion = sol.getFechaRealizacion();
        String hora_realizacion = sol.getHoraRealizacion();
        Solicitud sd = new Solicitud();
        
        try {
        ResultSet rst =
                stmt.executeQuery("INSERT INTO solicitud (descripcion, solicitante,"+
                " cola, pos_cola, prioridad, estado, fecha_realizacion, hora_realizacion)"+
                " VALUES ('"+descripcion+"', '"+solicitante+"', '"+cola+"', '"+pos_cola+
                "', '"+prioridad+"', '"+estado+"', '"+fecha_realizacion+"', '"+hora_realizacion+"')");
        } catch (SQLException ex) {
            if (!ex.getSQLState().equals("02000")) {
                throw new SQLException("No se pudo insertar en la BD.", ex.getSQLState());
            }
        }
        
        try {
            sd = Consultas.verSolicitud(fecha_realizacion, hora_realizacion, descripcion);
        } catch (Exception e) {}        
        
        return sd.getId();
    }
    
    public static int insertarCola(Cola cola) {
        
        Conexion.conectar();
        String code = "02000";
        
        try {
            Statement stmt = Conexion.conexion.createStatement();
            ResultSet rst = stmt.executeQuery("SELECT COUNT(*) AS total FROM cola");
            rst.next();
            int id = rst.getInt("total");
            String nombre = cola.getNombre();
            String descripcion = cola.getDescripcion();
            
            rst =
                    stmt.executeQuery("INSERT INTO cola (nombre, descripcion) "+
                    "VALUES ('"+nombre+"', '"+descripcion+"')");
        } catch (SQLException e) {
            /* Al ejecutar el query, siempre se lanza una excepcion.  *
             * Aqui se establece el codigo de estado de la BD despues *
             * de haber hecho la insercion.                           */
            code = e.getSQLState();
        }
        return Integer.parseInt(code);
    }
    
    public static int insertarServicio(Servicio serv)
    throws SQLException {
        
        Conexion.conectar();        
            
        Statement stmt = Conexion.conexion.createStatement();
        int id = -1;
                
        String nombre = serv.getNombre();
        String descripcion = serv.getDescripcion();
        int seccion = serv.getSeccion();
        System.out.println("Seccion: "+seccion);
        
        try {
            ResultSet rst =
                stmt.executeQuery("INSERT INTO servicio (nombre, descripcion, "+
                "seccion) VALUES ('"+nombre+"', '"+descripcion+"', '"+seccion+"')");
        } catch (SQLException ex) {
            if (!ex.getSQLState().equals("02000")) {
                throw new SQLException("No se pudo insertar en la BD.", ex.getSQLState());
            }
        }
         try {
            ResultSet rst1 =
                stmt.executeQuery("SELECT id FROM servicio WHERE (nombre = '"+
                nombre+"')");
            if (rst1.next())
                id = rst1.getInt("id");
        } catch (SQLException ex) {
            if (!ex.getSQLState().equals("02000")) {
                throw new SQLException("No se pudo insertar en la BD.", ex.getSQLState());
            }
        }
        
        return id;
    }
    
    public static int insertarSeccion(Seccion secc) {
        
        Conexion.conectar();
        String code = "02000";
        
        try {
            Statement stmt = Conexion.conexion.createStatement();            
            String nombre = secc.getNombre();
            String descripcion = secc.getDescripcion();
            int dpto = secc.getDepartamento();
            
            //ERROR: Ahora solo se inserta una seccion asociada al depto. 1
            ResultSet rst =
                    stmt.executeQuery("INSERT INTO seccion (nombre, descripcion,"+
                    " departamento) VALUES ('"+nombre+"', '"+descripcion+"', '"+dpto+"')");
        } catch (SQLException e) {
            /* Al ejecutar el query, siempre se lanza una excepcion.  *
             * Aqui se establece el codigo de estado de la BD despues *
             * de haber hecho la insercion.                           */
            code = e.getSQLState();
        }
        return Integer.parseInt(code);
    }
    
    public static int insertarPerfil(Perfil p) {
        
        Conexion.conectar();
        String code = "02000";
        
        try {
            Statement stmt = Conexion.conexion.createStatement();            
            String nombre = p.getNombre();
            String solicitud = p.getPermisoSolicitud();
            String seccion = p.getPermisoSeccion();
            String servicio = p.getPermisoServicio();
            String recurso = p.getPermisoRecurso();
            String cola = p.getPermisoCola();
            String usuario = p.getPermisoUsuario();
            String perfil = p.getPermisoPerfil();
            //nuevo MS                       
            ResultSet rst =
                    stmt.executeQuery("INSERT INTO perfil (nombre, solicitud, "+
                    "seccion, servicio, recurso, cola, usuario, perfil) VALUES ('"+
                    nombre+"', '"+solicitud+"', '"+seccion+"', '"+servicio+"', '"+
                    recurso+"', '"+cola+"', '"+usuario+"', '"+perfil+"')");
        } catch (SQLException e) {
            /* Al ejecutar el query, siempre se lanza una excepcion.  *
             * Aqui se establece el codigo de estado de la BD despues *
             * de haber hecho la insercion.                           */
            code = e.getSQLState();
        }
        return Integer.parseInt(code);
    }
    
    public static int insertarRecurso(Recurso recurso) {
        
        Conexion.conectar();
        String code = "02000";
        System.out.println("Entre a insertar");
        try {
            Statement stmt = Conexion.conexion.createStatement();            
            String nombre = recurso.getNombre();
            String descripcion = recurso.getDescripcion();
            int tipo_recurso = recurso.getTipoRecurso();
            int marca_recurso = recurso.getMarcaRecurso();
            int numero_bien = recurso.getNumeroBien();
            
            ResultSet rst =
                    stmt.executeQuery("INSERT INTO recurso (nombre, descripcion, "
                    +"tipo_recurso, marca_recurso, numero_bien)VALUES ('"+nombre+
                    "', '"+descripcion+"', '"+tipo_recurso+"', '"+marca_recurso+
                    "', '"+numero_bien+"')");
            System.out.println("Inserte en la BD");
        } catch (SQLException e) {
            /* Al ejecutar el query, siempre se lanza una excepcion.  *
             * Aqui se establece el codigo de estado de la BD despues *
             * de haber hecho la insercion.                           */
            System.out.println("Error al insertar en la BD");
            code = e.getSQLState();
        }
        return Integer.parseInt(code);
    }
    
    public static int insertarCampoSolicitud(CampoSolicitud campo)
    throws SQLException {
        Conexion.conectar();
        
        Statement stmt = Conexion.conexion.createStatement();      
        String nombre = campo.getNombre();
        int idCampo = -1;
        try {
            ResultSet rst =
                    stmt.executeQuery("INSERT INTO campo_solicitud (nombre, tipo_dato, "+
                    "longitud) VALUES ('"+nombre+"', '0', '0')");  
        } catch (SQLException ex) {
            if (!ex.getSQLState().equals("02000")) {
                throw new SQLException("No se pudo insertar en la BD.", ex.getSQLState());
            }
        }
        try {
            ResultSet rst1 =
                    stmt.executeQuery("SELECT id FROM campo_solicitud WHERE (nombre = '"+
                        nombre+"')");
            if (rst1.next()) 
                idCampo = rst1.getInt("id");            
            stmt.close();
        } catch (SQLException ex) {
            if (!ex.getSQLState().equals("02000")) {
                throw new SQLException("No se pudo insertar en la BD.", ex.getSQLState());
            }
        }
        
        return idCampo;
    }
    
    public static int insertarDepartamento(Departamento depto) {
        
        Conexion.conectar();
        String code = "02000";
        
        try {
            Statement stmt = Conexion.conexion.createStatement();            
            String nombre = depto.getNombre();
            String descripcion = depto.getDescripcion();
            
            ResultSet rst =
                    stmt.executeQuery("INSERT INTO departamento (nombre, descripcion"+
                    ") VALUES ('"+nombre+"', '"+descripcion+"')");
        } catch (SQLException e) {
            /* Al ejecutar el query, siempre se lanza una excepcion.  *
             * Aqui se establece el codigo de estado de la BD despues *
             * de haber hecho la insercion.                           */
            code = e.getSQLState();
        }        
        return Integer.parseInt(code);        
    }
    
    public static int insertarEstado(Estado estado) {
        
        Conexion.conectar();
        String code = "02000";
        
        try {
            Statement stmt = Conexion.conexion.createStatement();           
            String nombre = estado.getNombre();
            String descripcion = estado.getDescripcion();
            
            ResultSet rst =
                    stmt.executeQuery("INSERT INTO estado (nombre, descripcion) "+
                    "VALUES ('"+nombre+"', '"+descripcion+"')");
        } catch (SQLException e) {
            /* Al ejecutar el query, siempre se lanza una excepcion.  *
             * Aqui se establece el codigo de estado de la BD despues *
             * de haber hecho la insercion.                           */
            code = e.getSQLState();
        }
        return Integer.parseInt(code);
        
    }
    
    public static int insertarMarcaRecurso(MarcaRecurso marca) {
        
        Conexion.conectar();
        String code = "02000";
        
        try {
            Statement stmt = Conexion.conexion.createStatement();            
            String nombre = marca.getNombre();
            String descripcion = marca.getDescripcion();
            
            ResultSet rst =
                    stmt.executeQuery("INSERT INTO marca_recurso (nombre, descripcion)"+
                    " VALUES ('"+nombre+"', '"+descripcion+"')");
        } catch (SQLException e) {
            /* Al ejecutar el query, siempre se lanza una excepcion.  *
             * Aqui se establece el codigo de estado de la BD despues *
             * de haber hecho la insercion.                           */
            code = e.getSQLState();
        }        
        return Integer.parseInt(code);
        
    }
    
    public static int insertarPrioridad(Prioridad prioridad) {
        
        Conexion.conectar();
        String code = "02000";
        
        try {
            Statement stmt = Conexion.conexion.createStatement();            
            String nombre = prioridad.getNombre();
            String descripcion = prioridad.getDescripcion();
            
            ResultSet rst =
                    stmt.executeQuery("INSERT INTO prioridad (nombre, descripcion) "+
                    "VALUES ('"+nombre+"', '"+descripcion+"')");
        } catch (SQLException e) {
            /* Al ejecutar el query, siempre se lanza una excepcion.  *
             * Aqui se establece el codigo de estado de la BD despues *
             * de haber hecho la insercion.                           */
            code = e.getSQLState();
        }
        
        return Integer.parseInt(code);
        
    }
    
    public static int insertarSolicitante(Solicitante solicitante) {
        
        Conexion.conectar();
        String code = "02000";
        
        try {
            Statement stmt = Conexion.conexion.createStatement();
            int id = solicitante.getId();
            String nombre = solicitante.getNombre();
            String apellido = solicitante.getApellido();
            long telefono = solicitante.getTelefono();
            String email = solicitante.getEmail();
            int tipo_solicitante = solicitante.getTipo();
            
            ResultSet rst =
                    stmt.executeQuery("INSERT INTO solicitante VALUES ('"+id+"', '"+nombre+"', '"+apellido+"','"+telefono+"','"+email+"','"+tipo_solicitante+"')");
        } catch (SQLException e) {
            /* Al ejecutar el query, siempre se lanza una excepcion.  *
             * Aqui se establece el codigo de estado de la BD despues *
             * de haber hecho la insercion.                           */
            code = e.getSQLState();
        }        
        return Integer.parseInt(code);
        
    }
    
    public static int insertarTipoRecurso(TipoRecurso tipo_recurso) {
        
        Conexion.conectar();
        String code = "02000";
        
        try {
            Statement stmt = Conexion.conexion.createStatement();           
            String nombre = tipo_recurso.getNombre();
            String descripcion = tipo_recurso.getDescripcion();
            
            ResultSet rst =
                    stmt.executeQuery("INSERT INTO tipo_recurso (nombre, descripcion)"+
                    " VALUES ('"+nombre+"', '"+descripcion+"')");
        } catch (SQLException e) {
            /* Al ejecutar el query, siempre se lanza una excepcion.  *
             * Aqui se establece el codigo de estado de la BD despues *
             * de haber hecho la insercion.                           */
            code = e.getSQLState();
        }
        return Integer.parseInt(code);        
    }
    
    public static int insertarTipoSolicitante(TipoSolicitante tipo_solicitante) {
        
        Conexion.conectar();
        String code = "02000";
        
        try {
            Statement stmt = Conexion.conexion.createStatement();           
            String nombre = tipo_solicitante.getNombre();
            String descripcion = tipo_solicitante.getDescripcion();
            
            ResultSet rst =
                    stmt.executeQuery("INSERT INTO tipo_solicitante (nombre, descripcion)"+
                    " VALUES ('"+nombre+"', '"+descripcion+"')");
        } catch (SQLException e) {
            /* Al ejecutar el query, siempre se lanza una excepcion.  *
             * Aqui se establece el codigo de estado de la BD despues *
             * de haber hecho la insercion.                           */
            code = e.getSQLState();
        }
        return Integer.parseInt(code);
        
    }
    
    public static int insertarHistorialSolicitud(Solicitud solicitud, UsuarioServidor usuarioServidor,
            Estado estado, java.util.Date fecha_modificacion,
            String hora_modificacion, String observaciones) {
        
        Conexion.conectar();
        String code = "02000";
        
        try {
            Statement stmt = Conexion.conexion.createStatement();
            
            int sol = solicitud.getId();
            int usuario_servidor = usuarioServidor.getId();
            int nuevo_estado = estado.getId();
            
            ResultSet rst =
                    stmt.executeQuery("INSERT INTO historial_de_solicitudes VALUES ('"+sol+"', '"+fecha_modificacion+"', '"+hora_modificacion+"', '"+usuario_servidor+"', '"+observaciones+"', '"+nuevo_estado+"')");
        } catch (SQLException e) {
            /* Al ejecutar el query, siempre se lanza una excepcion.  *
             * Aqui se establece el codigo de estado de la BD despues *
             * de haber hecho la insercion.                           */
            code = e.getSQLState();
        }
        return Integer.parseInt(code);
        
    }
    
    public static int insertarRecursoAsociaRecurso(Recurso recurso_1, Recurso recurso_2) {
        
        Conexion.conectar();
        String code = "02000";
        
        try {
            Statement stmt = Conexion.conexion.createStatement();
            int id_recurso_1 = recurso_1.getId();
            int id_recurso_2 = recurso_2.getId();
            
            ResultSet rst =
                    stmt.executeQuery("INSERT INTO recurso_asocia_recurso VALUES ('"+id_recurso_1+"', '"+id_recurso_2+"')");
        } catch (SQLException e) {
            /* Al ejecutar el query, siempre se lanza una excepcion.  *
             * Aqui se establece el codigo de estado de la BD despues *
             * de haber hecho la insercion.                           */
            code = e.getSQLState();
        }
        return Integer.parseInt(code);
        
    }
    
    public static int insertarServicioIncluyeRecurso(Servicio servicio, Recurso recurso) {
        
        Conexion.conectar();
        String code = "02000";
        System.out.println("isertar recurso ");
       
        try {
            Statement stmt = Conexion.conexion.createStatement();
            int id_servicio = servicio.getId();
            int id_recurso = recurso.getId();
            System.out.println("servicio "+id_servicio);
            System.out.println("recurso "+id_recurso);
            
            ResultSet rst =
                    stmt.executeQuery("INSERT INTO servicio_incluye_recurso VALUES ('"+id_servicio+"', '"+id_recurso+"')");
        } catch (SQLException e) {
            /* Al ejecutar el query, siempre se lanza una excepcion.  *
             * Aqui se establece el codigo de estado de la BD despues *
             * de haber hecho la insercion.                           */
            code = e.getSQLState();
        }
        return Integer.parseInt(code);
        
    }
    
    public static int insertarServicioCampoSolicitud(Servicio servicio,
            CampoSolicitud campo_solicitud) throws SQLException {
        
        Conexion.conectar();
        String code = "02000";        
        try {
            Statement stmt = Conexion.conexion.createStatement();
            int id_servicio = servicio.getId();
            int id_campoSol = campo_solicitud.getId();
            System.out.println("ID servicio: "+id_servicio);
            System.out.println("ID campo: "+id_campoSol);
            
            ResultSet rst =
                    stmt.executeQuery("INSERT INTO servicio_tiene_campo_solicitud VALUES ('"+id_servicio+"', '"+id_campoSol+"')");
            System.out.println("intento meter servicio_tiene_campo_solicitud");
       } catch (SQLException ex) {
           System.out.println("atrapo excepcion en  servicio_tiene_campo_solicitud");
            if (!ex.getSQLState().equals("02000")) {
                throw new SQLException("No se pudo insertar en la BD.", ex.getSQLState());
            }
            code = ex.getSQLState();
        }
        
        return Integer.parseInt(code);
        
    }
    
    public static int insertarSolicitudCampoSolicitud(Solicitud solicitud,
            CampoSolicitud campo_solicitud, Object valor) {
        
        Conexion.conectar();
        String code = "02000";
        
        try {
            Statement stmt = Conexion.conexion.createStatement();
            int id_solicitud = solicitud.getId();
            int id_campoSol = campo_solicitud.getId();
            
            ResultSet rst =
                    stmt.executeQuery("INSERT INTO solicitud_posee_campo_solicitud VALUES ('"+id_solicitud+"', '"+id_campoSol+"', '"+valor+"')");
        } catch (SQLException e) {
            /* Al ejecutar el query, siempre se lanza una excepcion.  *
             * Aqui se establece el codigo de estado de la BD despues *
             * de haber hecho la insercion.                           */
            code = e.getSQLState();
        }
        
        return Integer.parseInt(code);
        
    }
    
    public static int insertarSolicitantePerteneceDepartamento(
            Solicitante solicitante, Departamento departamento) {
        
        Conexion.conectar();
        String code = "02000";
        
        try {
            Statement stmt = Conexion.conexion.createStatement();
            int id_solicitante = solicitante.getId();
            int id_dpto = departamento.getId();
            
            ResultSet rst =
                    stmt.executeQuery("INSERT INTO solicitante_pertenece_departamento VALUES ('"+id_solicitante+"', '"+id_dpto+"')");
        } catch (SQLException e) {
            /* Al ejecutar el query, siempre se lanza una excepcion.  *
             * Aqui se establece el codigo de estado de la BD despues *
             * de haber hecho la insercion.                           */
            code = e.getSQLState();
        }
        return Integer.parseInt(code);
        
    }
    
    public static int insertarSolicitudAsignadaUsuario(Solicitud solicitud,
            UsuarioServidor usuario_servidor, String observaciones,
            java.util.Date fecha_asignacion, String hora_asignacion) {
        
        Conexion.conectar();
        String code = "02000";
        int idEdoAsig = -1;
        try {
            idEdoAsig = Consultas.idEstadoSolicitud("Asignada");
            Actualizacion.actualizarEstado(solicitud.getId(), idEdoAsig);
            System.out.println("Id asignada: "+idEdoAsig);
        }
        catch (ServletException e) {}
        catch (IOException e) {}
        
        try {
            Statement stmt = Conexion.conexion.createStatement();
            int id_solicitud = solicitud.getId();
            int id_usuario_servidor = usuario_servidor.getId();
            
            ResultSet rst =
                    stmt.executeQuery("INSERT INTO solicitud_es_asignada_usuario_servidor VALUES ('"+id_solicitud+"', '"+id_usuario_servidor+"', '"+observaciones+"', '"+fecha_asignacion+"', '"+hora_asignacion+"')");
            //actualizar el estado de la solicitud en la tabla 'solicitud'
           
        } catch (SQLException e) {
            /* Al ejecutar el query, siempre se lanza una excepcion.  *
             * Aqui se establece el codigo de estado de la BD despues *
             * de haber hecho la insercion.                           */
            code = e.getSQLState();
        }
        
        return Integer.parseInt(code);
        
    }
    
    public static int insertarSolicitudRequiereServicio (int id_solicitud,
            int id_servicio) {
        
        Conexion.conectar();
        String code = "0200";
               
        try {
            Statement stmt = Conexion.conexion.createStatement();
           
                       
            ResultSet rst =
                    stmt.executeQuery("INSERT INTO solicitud_requiere_servicio VALUES ('"+id_solicitud+"', '"+id_servicio+"')");
        } catch (SQLException e) {
            /* Al ejecutar el query, siempre se lanza una excepcion.  *
             * Aqui se establece el codigo de estado de la BD despues *
             * de haber hecho la insercion.                           */
            code = e.getSQLState();
        }
        return Integer.parseInt(code);
        
    }  
    
    /*public static void addHistoria(UsuarioServidor usr, String text, 
            Solicitud sol) throws ServletException, IOException {
        
        Conexion.conectar();
                
        try {
            
            Statement stmt = Conexion.conexion.createStatement();
            int idSol = sol.getId();
            java.util.Date fecha = new java.util.Date();
            long hora =  fecha.getTime();
            int idUsr = usr.getId();
                        
            ResultSet rst = stmt.executeQuery
                ("INSERT INTO solicitud_requiere_servicio " +
                 "VALUES ('"+idSol+"', '"+fecha+"', '"+hora+"', '"+idUsr+"', '"+text+"', '"+2+"')");
            
        } catch (SQLException e) {
            /* Al ejecutar el query, siempre se lanza una excepcion.  *
             * Aqui se establece el codigo de estado de la BD despues *
             * de haber hecho la insercion.                           
            e.printStackTrace();
            return;
        }
    }*/
}
